package ch3;

import util.Debug;
import util.Tools;

import java.util.HashMap;
import java.util.Map;

/**
 * static关键字可见性保障示例
 * init方法启动的线程至少可以看到语句1-语句3的操作结果，即该线程总是可以看到static字段taskConfig的初始值
 * 如果init方法执行的时候，其他线程执行了changeConfig方法，那么init方法中启动的线程能否读取到taskConfig的相对新值是没有保障的
 *
 * 总结：static关键字仅能保障线程能够读取到相应字段的初始值，而不是相对新值
 */

public class StaticVisibilityExample {
    private static Map<String, String> taskConfig;

    static {
        Debug.info("The class being initialzied...");
        taskConfig = new HashMap<>();
        taskConfig.put("url", "https://github.com/Viscent");
        taskConfig.put("timeout", "1000");
    }

    public static void changeConfig(String url, int timeout) {
        taskConfig = new HashMap<>();
        taskConfig.put("url", url);
        taskConfig.put("timeout", String.valueOf(timeout));
    }

    public static void init() {
        Thread t = new Thread() {
            @Override
            public void run() {
               String url = taskConfig.get("url");
               String timeout = taskConfig.get("timeout");
               doTask(url, Integer.valueOf(timeout));
            }
        };
        t.start();
    }

    private static void doTask(String url, int timeout) {
        //... 省略业务代码
        Tools.randomPause(500);
    }
}
